<?php
class Animales extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Parámetros :: Animales';
	var $nombre_entidad = 'Animal';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'afiliados/'; 	// Directorio donde están contenidas las vistas gestionadas por el controlador
	var $pagina_editar; 					// Nombre de la vista de edición
	var $pagina_ver_todos;						// Nombre de la vista para mostrar todos
	var $pagina_ver;

	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_editar = $this->CARPETA_VISTAS . 'animal_edit_view';
    	$this->pagina_ver_todos = $this->CARPETA_VISTAS . 'animal_ver_todos_view';
    	$this->pagina_ver = $this->CARPETA_VISTAS . 'animal_ver_view';
    	$this->pagina_busqueda = $this->CARPETA_VISTAS . 'animal_buscar_view';
	}
	
	
	public function nuevo()
	{
		$dataView['title'] = 'Agregar Mascota';
		$dataView['id_elemento'] = NULL; 	// IMPORTANTE: debe ser nulo para uno nuevo

		$this->_cargarFormEdicion($dataView);
	}

	public function editar($id_elemento)
	{
		$dataView['title'] = 'Editar  Mascota';
		$dataView['id_elemento'] = $id_elemento;

		$this->_cargarFormEdicion($dataView);
	}

	private function _cargarFormEdicion($dataView, $cargaCompleta = FALSE)
	{
		if(!isset($dataView['obj'.$this->nombre_entidad]))
		{
			$id_elemento = $dataView['id_elemento'];

			// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
			$obj_animal = new Animal($id_elemento);
			$dataView['obj'.$this->nombre_entidad] = $obj_animal;
		}

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_raza = new Raza();
		$dataView['listado_razas'] = $obj_raza->get_iterated();

		$obj_contextura = new Contextura();
		$dataView['listado_contexturas'] = $obj_contextura->get_iterated();

		$obj_pelaje = new Pelaje();
		$dataView['listado_pelajes'] = $obj_pelaje->get_iterated();

		$obj_prestador = new Prestador();
		$dataView['listado_prestadores'] = $obj_prestador->get_iterated();

		if($cargaCompleta) $dataView['modalDesactivado'] = TRUE;

		parent::_loadViews($this->pagina_editar, $dataView, $cargaCompleta);
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar Mascota';
		$dataView['error'] = '';

		// Se obtienen los datos del formulario para poblar el modelo
		$id_animal = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$obj_animal = new Animal($id_animal);
		$obj_animal->nombre = $this->input->post('txt_nombre_mascota');
		$obj_animal->sexo = $this->input->post('txt_sexo');
		$obj_animal->fecha_nacimiento = $this->input->post('txt_nacimiento_mascota');
		$obj_animal->signos_particulares = $this->input->post('txtarea_signos_mascota');
		$obj_animal->observaciones = $this->input->post('txt_observaciones_mascota');
		$obj_animal->peso = $this->input->post('txt_peso_mascota');
		$obj_animal->color = $this->input->post('txt_color_mascota');
		$obj_animal->fecha_ingreso = $this->input->post('txt_ingreso_mascota');

		if($id_animal == 0 || $id_animal == NULL) $obj_animal->fecha_creacion = date('Y-m-d H:i:s');
		else $obj_animal->fecha_modificacion = date('Y-m-d H:i:s');

		// Defino el objeto que se desea asociar
		$id_raza = is_numeric($this->input->post('txt_raza')) ? $this->input->post('txt_raza') : NULL;
		$obj_raza = new Raza($id_raza);

		$id_prestador = is_numeric($this->input->post('txt_prestador')) ? $this->input->post('txt_prestador') : NULL;
		$obj_prestador = new Prestador($id_prestador);
		
		$id_contextura = is_numeric($this->input->post('txt_contextura')) ? $this->input->post('txt_contextura') : NULL;
		$obj_contextura = new Contextura($id_contextura);

		$id_pelaje = is_numeric($this->input->post('txt_pelaje')) ? $this->input->post('txt_pelaje') : NULL;
		$obj_pelaje = new Pelaje($id_pelaje);

		// Se manejan transacciones para interactuar con la BD
		$obj_animal->trans_begin();
		$operacion_exitosa = $obj_animal->save(array($obj_raza, $obj_contextura, $obj_pelaje, $obj_prestador));
		if(!$operacion_exitosa && !$obj_animal->valid) // Falló la validación de datos
		{
			// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
			$dataView['obj'.$this->nombre_entidad] = $obj_animal;
			$dataView['error'] = $obj_animal->error->string;
			$this->_cargarFormEdicion($dataView, TRUE);
		}
		else
		{
			if ($obj_animal->trans_status() === FALSE) // Se chequea el estado de la transacción
			{
			    $obj_animal->trans_rollback(); // Si la transacción falló, hago un rollback
			}
			else
			{
			    $obj_animal->trans_commit(); // Transacción exitosa, realizo el commit
			}

			$dataView['error'] = $obj_animal->error->string; // Almaceno todos los errores que hubieran podido ocurrir
			$this->ver_todos($dataView);
		}
	}

	public function ver_todos($dataView = array())
	{
		$dataView['title'] = 'Listado de  Mascotas';

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_raza = new Raza();
		$dataView['listado_razas'] = $obj_raza->get_iterated();

		$obj_contextura = new Contextura();
		$dataView['listado_contexturas'] = $obj_contextura->get_iterated();

		$obj_pelaje = new Pelaje();
		$dataView['listado_pelajes'] = $obj_pelaje->get_iterated();

		$obj_prestador = new Prestador();
		$dataView['listado_prestadores'] = $obj_prestador->get_iterated();

		$dataView['listado'] = $this->_aplicarFiltros();
		parent::_loadViews($this->pagina_ver_todos, $dataView);
	}

	private function _aplicarFiltros()
	{
		$existe_filtro = FALSE;

		// Listado de afiliados
		$obj_animal = new Animal();

		$id_mascota = is_numeric($this->input->post('filtro_id_mascota')) ? $this->input->post('filtro_id_mascota') : 0;
		if($id_mascota != 0) { $obj_animal->where('id', $id_mascota); $existe_filtro = TRUE; }

		$nombre_mascota = trim($this->input->post('filtro_nombre_mascota'));
		if($nombre_mascota != '') { $obj_animal->ilike('nombre', $nombre_mascota); $existe_filtro = TRUE; }

		$id_raza = is_numeric($this->input->post('filtro_raza')) ? $this->input->post('filtro_raza') : 0;
		if($id_raza != 0) { $obj_animal->where('raza_id', $id_raza); $existe_filtro = TRUE; }

		$id_contextura = is_numeric($this->input->post('filtro_contextura')) ? $this->input->post('filtro_contextura') : 0;
		if($id_contextura != 0) { $obj_animal->where('contextura_id', $id_contextura); $existe_filtro = TRUE; }

		$id_pelaje = is_numeric($this->input->post('filtro_pelaje')) ? $this->input->post('filtro_pelaje') : 0;
		if($id_pelaje != 0) { $obj_animal->where('pelaje_id', $id_pelaje); $existe_filtro = TRUE; }

		$fecha_ingreso = trim($this->input->post('filtro_fecha_ingreso'));
		if($fecha_ingreso != '') { $obj_animal->where('fecha_ingreso', $this->util_fechas->prepararFecha($fecha_ingreso)); $existe_filtro = TRUE; }

		$prestador = is_numeric($this->input->post('filtro_prestador')) ? $this->input->post('filtro_prestador') : 0;
		if($prestador != 0) { $obj_animal->where('prestador_id', $prestador); $existe_filtro = TRUE; }

		// Si no se hubieran realizado filtros, se muestran los 10 primeros
		if(!$existe_filtro) {
			$obj_animal->limit(10);
			$obj_animal->order_by('id', 'desc');
		}

		return $obj_animal->get_iterated();
	}

	public function buscar($pagina_solicitante)
	{
		$dataView['title'] = 'Búsqueda de Mascotas';

		// Según el formulario que lo llama, defino dónde se debe mostrar el resultado de la búsqueda
		$partes = explode('-', $pagina_solicitante);
		$dataView['nombre_controlador'] = $partes[0];
		$dataView['metodo'] = $partes[1];

		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$dataView['listado'] = $this->_aplicarFiltros();

		$dataView['duenio_id'] = is_numeric($this->input->post('duenio')) ? $this->input->post('duenio') : NULL;
		
		parent::_loadViews($this->pagina_busqueda, $dataView, FALSE);
	}

	public function eliminar($id_elemento)
	{
		$dataView['title'] = 'Eliminar Mascota';
		$dataView['error'] = '';

		if($this->validarEliminacion($id_elemento))
		{
			// Se obtiene el objeto que se desea eliminar
			$obj_animal = new Animal($id_elemento);
			
			// Se manejan transacciones para interactuar con la BD
			$obj_animal->trans_begin();
			$obj_animal->delete();
			if ($obj_animal->trans_status() === FALSE) // Se chequea el estado de la transacción
			{
			    $obj_animal->trans_rollback(); // Si la transacción falló, hago un rollback
			}
			else
			{
			    $obj_animal->trans_commit(); // Transacción exitosa, realizo el commit
			}

			$dataView['error'] = $obj_animal->error->string; // Almaceno todos los errores que hubieran podido ocurrir
			$this->ver_todos($dataView);
		}
		else
		{
			$dataView['error'] = 'No se puede eliminar la mascota elegida ya que existen afiliados asociados a la misma.';
			$dataView['path_volver'] = 'animales/ver_todos';
			parent::_loadViews($this->template->getErrorMessageView(), $dataView);
		}
	}

	/* IMPORTANTE: este método es llamado desde la función heredada de MY_Controller, "borradoPosible" */
	protected function validarEliminacion($id_elemento)
	{
		// Busco si existen afiliados asociados a la mascota que se desea eliminar
    	$obj_afiliado = new Afiliado();
    	$obj_afiliado->where('animal_id', $id_elemento);

		if ($obj_afiliado->count() == 0) {
			 return TRUE;
		}
		else return FALSE;
	}

	public function ver($id_elemento)
	{
		$dataView['title'] = 'Ver Mascota';

		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$obj_animal = new Animal($id_elemento);
		$dataView['obj'.$this->nombre_entidad] = $obj_animal;

		parent::_loadViews($this->pagina_ver, $dataView, FALSE);
	}
}